package _go

/*剑指 Offer 47. 礼物的最大价值
在一个 m*n 的棋盘的每一格都放有一个礼物，每个礼物都有一定的价值（价值大于 0）。你可以从棋盘的左上角开始拿格子里的礼物，并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值，请计算你最多能拿到多少价值的礼物？



示例 1:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物


提示：

0 < grid.length <= 200
0 < grid[0].length <= 200*/

func maxValue(grid [][]int) int {
	n := len(grid)
	if n == 0 {
		return 0
	}
	m := len(grid[0])
	if m == 0 {
		return 0
	}

	//定义动规数组 第i j 位置的最大值
	dp := make([][]int, n)

	//一定要记得初始化 二维数组
	for i := 0; i < n; i++ {
		dp[i] = make([]int, m)
	}

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			//i == 0 或者 j== 0 的特殊处理   还有0 值的初始化
			if i == 0 && j == 0 {
				dp[0][0] = grid[0][0]
			} else if i == 0 {
				dp[0][j] = dp[0][j-1] + grid[i][j]
			} else if j == 0 {
				dp[i][0] = dp[i-1][0] + grid[i][j]
			} else {
				//因为只能是向下或者向右  所以就是两个值的最大值 加上当前节点的值
				dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]
			}
		}
	}
	return dp[n-1][m-1]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
